
import axios from "axios";
import { ElMessage, ElMessageBox } from 'element-plus'
//定义实例属性，用来设置默认请求参数
const defaults = {
  baseURL: '',  //请求基准地址
  url: '',  //接口的请求路径
  data: {},  //请求参数 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
  method: 'GET',  //默认的请求方法
  //设置请求头
  headers: {
    "Content-type": "application/json",  //数据的交互格式
  },
  timeout: 30000,  //默认的超时时长，小程序默认的超时时长是1分钟
}
const instance = axios.create({
  baseURL: import.meta.env.VITE_APP_BASEURL,
  timeout: 10000,
});

instance.defaults = defaults

// 添加请求拦截器
instance.interceptors.request.use((config) => {
  // 在发送请求之前做些什么
  const timestamp = Date.now()
  config.url = config.url + '?timestamp=' + timestamp
  //在发送请求之前，需要先判断本地是否存在访问令牌 token
  const token = 'Bearer ' + localStorage.getItem('token')
  //如果存在 token，就需要在请求头中添加 token 字段
  if (token) {
    config.headers['Authorization'] = token
  }

  return config;
}, (error) => {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(async (response) => {
  //对服务器响应的数据做点什么...
  const { data } = response
  console.log('22222222222222222222', response);

  //判断服务器响应的业务状态码
  switch (data.code) {
    //如果返回的状态码等于 200 ，说明请求成功，服务器成功响应了数据
    case 200:
      return data
    //如果返回的状态码等于 208 ，说明没有 token，或者 token 失效
    //就需要让用户登陆或者重新登陆
    case 401:
      ElMessageBox.confirm(
        '登录状态已过期，您可以继续留在该页面，或者重新登录',
        '系统提示',
        {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning',
        }
      )
        .then(() => {
          //清除之前失效的 token ，同时要清除本地存储的全部信息
          ElMessage({
            type: 'success',
            message: 'Delete completed',
          })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: 'Delete canceled',
          })
        })
      return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
    default:
      // toast({
      //   title: data.message
      // })
      return Promise.reject(response)
  }
}, (error) => {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});

export default instance


